//package cn.sfrog.project.biz.admin.pay.impl;
//
//import cn.hutool.core.date.DateUtil;
//import cn.hutool.core.util.IdUtil;
//import cn.hutool.crypto.digest.DigestUtil;
//import cn.sfrog.common.core.domain.AjaxResult;
//import cn.sfrog.common.exception.base.BaseException;
//import cn.sfrog.common.utils.ip.IpUtils;
//import cn.sfrog.web.ximanlin.mapper.BizOrderMapper;
//import cn.sfrog.web.ximanlin.mapper.BizPaymentMapper;
//import cn.sfrog.web.ximanlin.service.IBizPaymentService;
//import cn.sfrog.web.ximanlin.util.pay.PayFactory;
//import com.alibaba.fastjson.JSON;
//import com.ijpay.core.enums.SignType;
//import com.ijpay.core.enums.TradeType;
//import com.ijpay.core.kit.WxPayKit;
//import com.ijpay.wxpay.WxPayApi;
//import com.ijpay.wxpay.model.UnifiedOrderModel;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.math.BigDecimal;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.TreeMap;
//
//@Qualifier("wxPayService")
//@Component
//@Slf4j
//public class WxPayService extends PayFactory {
//    @Autowired
//    private BizOrderMapper orderMapper;
//    @Autowired
//    private BizPaymentMapper paymentMapper;
//    @Autowired
//    private IBizPaymentService paymentService;
//
//    //生成预支付订单  统一下单
//    public static final String CREATE_WX_ORDER = "https://api.mch.weixin.qq.com/pay/unifiedorder";
//
//    @Value("${pay.wx.appid}")
//    private String appid;
//
//    @Value("${pay.wx.mchid}")
//    private String mchId;
//
//    @Value("${pay.wx.partnerKey}")
//    private String partnerKey;
//
//    @Value("${pay.wx.notifyUrl}")
//    private String notifyUrl;
//
//    @Override
//    public AjaxResult buildPayParams(String tradeSn, BigDecimal price) {
////        BizOrder order = orderMapper.selectBizOrderByOrderNo(orderSn);
////        if (order == null) {
////            return AjaxResult.error("订单不存在");
////        }
////        //生成一个payment支付流水
////        BizPayment bizPayment = super.preparePaymentInfo(order, PayMethodEnum.ALI_PAY);
////        if(paymentMapper.insertBizPayment(bizPayment) <= 0){
////            throw new BaseException("生成支付流水失败");
////        }
//        //生成预支付订单
//        BigDecimal totalMoney = price.multiply(BigDecimal.valueOf(100L));
//        // 统一下单构建请求参数
//        Map<String, String> params = UnifiedOrderModel
//                .builder()
//                .appid(appid)
//                .mch_id(mchId)
//                .nonce_str(WxPayKit.generateStr())
//                .body("喜满邻-商品支付")
//                .out_trade_no(tradeSn)
//                .total_fee(totalMoney.intValue() + "")
//                .spbill_create_ip(IpUtils.getHostIp())
//                .notify_url(notifyUrl)
//                .trade_type(TradeType.APP.getTradeType())
//                .build()
//                .createSign(partnerKey, SignType.HMACSHA256);
//        //统一下单
//        String res = WxPayApi.pushOrder(params);
//        Map<String, String> result = WxPayKit.xmlToMap(res);
//        String returnCode = result.get("return_code");
//        if (!WxPayKit.codeIsOk(returnCode)) {
//            throw new BaseException("微信下单错误:"+returnCode);
//        }
//        //生成预付订单success
//        String prepayId = result.get("prepay_id");
//        // 二次签名，构建公众号唤起支付的参数,这里的签名方式要与上面统一下单请求签名方式保持一致
//        Map<String, String> packageParams = WxPayKit.prepayIdCreateSign(prepayId,
//                appid,partnerKey, SignType.HMACSHA256);
//        // 将二次签名构建的数据返回给前端并唤起公众号支付
//        String jsonStr = JSON.toJSONString(packageParams);
//        return AjaxResult.success(jsonStr);
//    }
//
//    @Override
//    public Map<String,Object> callback(HttpServletRequest request, HttpServletResponse response) {
//        HashMap<String, Object> resultMap = new HashMap<>();
//        //获取回调参数
//        Map<String, String> params = getParamsByRequest(request);
//        if("SUCCESS".equals(params.get("result_code"))){
//            //验证签名--创建签名-和传过来的比较
//            boolean b = WxPayKit.verifyNotify(params, partnerKey);
//            if(b){
//                Date timeEndDate = DateUtil.parse(params.get("time_end"),"yyyyMMddHHmmss");
//                paymentService.paySuccess(params.get("out_trade_no"),params.get("transaction_id"),timeEndDate);
//                resultMap.put("return_code","SUCCESS");
//                resultMap.put("return_msg","OK");
//                return resultMap;
//            }
//        }
//        resultMap.put("return_code","FAIL");
//        resultMap.put("return_msg","ERROR");
//        return resultMap;
//    }
//
//    @Override
//    public boolean queryPayStatus(String sn) throws Exception {
//        HashMap<String, String> hashMap = new HashMap<>();
//        hashMap.put("appid",appid);
//        hashMap.put("mch_id",mchId);
//        hashMap.put("nonce_str", IdUtil.simpleUUID());
//        hashMap.put("out_trade_no",sn);
//        hashMap.put("sign_type", SignType.MD5.getType());
//        hashMap.put("sign", createSign(hashMap,partnerKey));
//        String res = WxPayApi.orderQuery(hashMap);
//        Map<String, String> result = WxPayKit.xmlToMap(res);
//        if("SUCCESS".equals(result.get("return_code")) && "SUCCESS".equals(result.get("result_code")) && "SUCCESS".equals(result.get("trade_state"))){
//            Date timeEndDate = DateUtil.parse(result.get("time_end"),"yyyyMMddHHmmss");
//            paymentService.paySuccess(sn,result.get("transaction_id"),timeEndDate);
//            return true;
//        }
//        return false;
//    }
//
//    @Override
//    public void closeOrder(String sn) throws Exception {
//        HashMap<String, String> hashMap = new HashMap<>();
//        hashMap.put("appid",appid);
//        hashMap.put("mch_id",mchId);
//        hashMap.put("out_trade_no",sn);
//        hashMap.put("nonce_str", IdUtil.simpleUUID());
//        hashMap.put("sign_type", SignType.MD5.getType());
//        hashMap.put("sign", createSign(hashMap,partnerKey));
//        String res = WxPayApi.closeOrder(hashMap);
//        Map<String, String> resMap = WxPayKit.xmlToMap(res);
//        if(!"SUCCESS".equals(resMap.get("return_code"))){
//            //关单成功
//            log.error("关闭订单失败，流水编号："+sn + " " + resMap.get("err_code"));
//        }
//    }
//
//    public static String createSign(Map<String, String> params, String pubkey) {
//        TreeMap<String, String> sortedParams = new TreeMap<>(params);
//        StringBuilder builder = new StringBuilder();
//        for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
//            builder.append(entry.getKey()).append('=').append(entry.getValue()).append('&');
//        }
//        builder.append("key=").append(pubkey);
//        return DigestUtil.md5Hex(builder.toString());
//    }
//    //获取微信回调的参数
//    private Map<String,String> getParamsByRequest(HttpServletRequest request){
//        String temp = "";
//        StringBuilder params = new StringBuilder();
//        try{
//            while((temp = request.getReader().readLine()) != null){
//                params.append(temp);
//            }
//        }catch (Exception e){
//            //ignore
//        }
//        return WxPayKit.xmlToMap(params.toString());
//    }
//
//}
